gtknotebook: avoid tab dnd from content
authorCarlos Soriano <csoriano@gnome.org>
Mon, 2 May 2016 08:19:12 +0000 (10:19 +0200)
committerCarlos Soriano <csoriano@gnome.org>
Mon, 2 May 2016 11:17:48 +0000 (13:17 +0200)
Before commit 6c1bee2377eba8 we were setting an attribute of GtkNotebook
to track the pressed button if the pressed button happened on the
tab itself.
Later in the motion handling code we were checking whether the private
pressed button attribute was set or not in order to handle a tab dnd
or not.

In commit 6c1bee2377eba8 the code changed and set the pressed button
variable unconditionally, which means, a motion event from within the
tab content triggered a tab reordering.

This happened only if the children hierarchy have a widget that bubbles
up both button press event, which sets the private pressed button
attribute; and motion events, which started the tab dnd checking the
private pressed button attribute.
A widget that experienced the regression was GtkListBox.

In order to fix it, set the button pressed variable only when it press
the tab itself, not the content.

https://bugzilla.gnome.org/show_bug.cgi?id=764395

gtk/gtknotebook.c

index 98ac9c6963a3c52927cade14a572a5d0d801c1d3..259b79acb024297dfe68486bcafe9015bc24bfbb 100644 (file)
@@ -2747,8 +2747,6 @@ gtk_notebook_button_press (GtkWidget      *widget,
   if (event->button != GDK_BUTTON_PRIMARY)
     return FALSE;
 
-  priv->pressed_button = event->button;
-
   if ((tab = get_tab_at_pos (notebook, x, y)) != NULL)
     {
       GtkAllocation allocation;
@@ -2767,6 +2765,8 @@ gtk_notebook_button_press (GtkWidget      *widget,
       /* save press to possibly begin a drag */
       if (page->reorderable || page->detachable)
         {
+          priv->pressed_button = event->button;
+
           priv->mouse_x = x;
           priv->mouse_y = y;